纹理背景知识

在WebGL1中,纹理包括2D纹理和立方体纹理,在实际的使用中,如果纹理的图片是宽和高是2的幂,可以自动生成纹理的mipmap。
除此之外,还可以通过gl.texImage2D函数独立指定纹理的每个mipmap的级别。
因此,这会导致一个一般的编程人员不易觉察的问题,这涉及到显卡底层驱动。
简单来说,就是会导致驱动程序无法在绘图之前确定纹理是否完全指定,因此它必须检查每一个mip贴图级别或者子图像的格式是否相符、每一个级别的大小是否正确以及是否有足够的内存。这种绘图时检查可能代价很高,而使用不可变纹理可以避免这种情形。

不可变纹理

使用不可变纹理,可以减少上文中提到的因检查而导致的性能开销。 不可变纹理指的是纹理的一种分配方式,而不是值纹理的内容。
不可变纹理的思路是:在给纹理加载纹理数据之前,先指定纹理的格式和大小,显卡驱动程序可以提前进行一致性、内存的检查,一旦指定了纹理的格式和大小之后,纹理的格式和尺寸就不能更改,但是可以通过gl.texSubImage2D、texSubImage3D(注意不能用gl.txtImage2D)等方法来加载纹理的数据,同时还可以使用such as render-to-texture, mipmap generation等方式加载纹理数据。

texSubImage3D(以及后面提到的texStorage3D)方法与3D纹理有关,后续相关文章会介绍。
创建不可变纹理

创建不可变纹理很简单,首先通过gl.bindTexture方法绑定纹理对象,然后通过调用gl. texStorage2D、texStorage3D指定纹理的大小和格式,来创建不可变的存储空间。代码如下:

  // -- Allocate storage for the texture
 gl.texStorage2D(gl.TEXTURE_2D, 1, gl.RGB8, 512, 512);
 gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGB, gl.UNSIGNED_BYTE, image);
 gl.generateMipmap(gl.TEXTURE_2D);
不可变纹理可以优化性能

在很多情况下,我们的纹理的尺寸和数据格式都是不需要改变的。使用不可变纹理,可以避免驱动程序对这些不需要改变的尺寸和数据格式的纹理对象进行一致性和内存大小的检查,因此可以获得更佳的性能。

案例:使用不可变纹理

暂无

后记

本节只讲述了2D的不可变纹理,3D的不可变纹理类似,在将3D纹理的时候会进一步讲述。


netcy
204 声望120 粉丝

欢迎对canvas、webgl、图形学感兴趣的读者订阅专栏。